关于svn:如何删除工作副本中所有未版本控制/忽略的文件/文件夹?

您所在的位置:网站首页 svn的clean up删除的文件找回 关于svn:如何删除工作副本中所有未版本控制/忽略的文件/文件夹?

关于svn:如何删除工作副本中所有未版本控制/忽略的文件/文件夹?

2023-11-14 07:20| 来源: 网络整理| 查看: 265

如果我有Subversion存储库的工作副本,是否可以用一个命令或工具删除该工作副本中所有未版本控制或忽略的文件? 本质上,我正在寻找git clean的SVN类似物。

命令行或GUI解决方案(对于TortoiseSVN)都是可以接受的。

相关讨论 自动删除Subversion未版本化文件的可能重复项

1svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf"$f"; done

具有以下功能:

忽略和未跟踪的文件都将被删除 即使文件名包含空格也可以使用(换行符除外,但是除了使用--xml选项并解析生成的xml输出之外,没有太多可做的事情) 即使svn status在文件名之前打印其他状态字符也可以使用(不应这样做,因为不会跟踪文件,但以防万一...) 它可以在任何符合POSIX的系统上运行

我使用一个名为svnclean的外壳脚本,其中包含以下内容:

12345678910111213141516171819#!/bin/sh # make sure this script exits with a non-zero return value if the # current directory is not in a svn working directory svn info >/dev/null || exit 1 svn status --no-ignore | grep '^[I?]' | cut -c 9- | # setting IFS to the empty string ensures that any leading or # trailing whitespace is not trimmed from the filename while IFS= read -r f; do     # tell the user which file is being deleted.  use printf     # instead of echo because different implementations of echo do     # different things if the arguments begin with hyphens or     # contain backslashes; the behavior of printf is consistent     printf '%s '"Deleting ${f}..."     # if rm -rf can't delete the file, something is wrong so bail     rm -rf"${f}" || exit 1 done 相关讨论 正是我要寻找的东西,在Linux和MacOS上也像魅力一样起作用! 您需要重设IFS吗?我选择不制作svnclean脚本。所以我想知道这是否会破坏其余脚本的IFS ... @matrixugly:不,您不需要将IFS更改回之前的状态。当您执行VARNAME=value command时,将value分配给VARNAME仅在执行command期间适用(某些例外不适用于read)。有关更多详细信息,请参见POSIX规范和此POSIX错误报告。 @rich,谢谢分享。几年前开始寻找svn清理解决方案,并且还拥有一些shell脚本知识!显然,我已经回到这个答案了很多。

我知道这是旧的,但万一其他人迷失了它,则新版本(1.9或更高版本)的svn支持--remove-unversioned,例如svn cleanup . --remove-unversioned。

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options

相关讨论 对我来说,这是正确的答案。它是跨平台的命令行答案。另外,您可以使用svn cleanup . --remove-ignored删除忽略的文件 适用于svn 1.6及更高版本。 请将其更改为1.9,另请参见subversion.apache.org/docs/release-notes/1.9.html(我在本地尝试过,但没有成功,而Im在1.8.8上) 在TortoiseSVN随附的v1.9.4上进行了尝试,该开关似乎完全无效。 似乎问题在于它不会删除未版本控制的文件夹。 @Nyerguds:是的,这不会删除未版本控制的文件夹,而只会删除未版本控制的文件。 有没有人找到解决方案? @phoenix我最终编写了一个小的c#命令行工具,该工具调用svn status --depth=infinity -v --xml并进行解析以找出要删除的文件。 只需要小心忽略.svn文件夹即可。 此开关刚刚为我删除了未版本控制的文件夹。 由于问题是如何删除未版本控制和忽略的文件,因此完整答案为svn cleanup --remove-unversioned --remove-ignored . 刚刚在工作目录中尝试svn cleanup --remove-ignored,并注意到它(当然)会删除Subversion中隐藏的资源,但Id非常喜欢保留资源,例如 virtualenv或其他SCM工具的目录。 为了使svn switch成功,在大多数情况下,仅删除子目录中的忽略文件就足够了...

使用TortoiseSVN:

右键单击工作副本文件夹,同时按住Shift键 选择"删除未版本化的项目" 相关讨论 不错的功能!不过,我不得不阅读链接,以发现它仅适用于XP上的列表视图(而不是树形视图)-也许您应该将其包括在答案中。 svn的命令行版本(特别是在Windows上)是否不提供相同的功能? 正如sombody在下面指出的:svn cleanup --remove-unversioned --remove-ignored .

这个单人可能会帮助您:

1$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

小心使用!

相关讨论 这不会删除被忽略的文件,并且如果文件名包含空格,则会中断 它还不会删除忽略的文件 您可以使用svn status --no-ignore很好地捕获被忽略的文件。 实际上,我认为这是一种可选功能,可以将忽略的文件留在原地。 如果有机会选择最常用的SO答案,我会选择这个。

使用Powershell修改Yanal-Yves Fargialla和gimpf的答案(但Stackoverflow不允许对原始帖子发表评论):

1powershell -Command"&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

这将添加克拉(" ^")以指定行的开头,避免匹配包含字母" i"的所有文件。还要将-recurse和-force的标志添加到rm,以使该命令不交互式,因此可以在脚本中使用。

相关讨论 该命令在末尾需要额外的双引号。只需将其添加即可,但显然必须至少包含六个字符。

使用powershell:

1(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

从命令行:

1powershell -Command"&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}" 相关讨论 我喜欢这个纯Windows脚本!我建议使用-match [\?i] -replace ^.{8}代替,即使文件名以空格开头,它也可以正常工作,并且还会删除忽略的文件。 建议使用gimpfs进行调整,效果很好,但是我遇到了遇到ItemNotFoundException的情况。事实证明,svn状态结果集中只有一个文件。此调整可解决以下问题:code @(svn status --no-ignore)-match [?i] -replace ^。{8} | rm`。在这篇文章的帮助下找到了答案 并且因为这会提示您输入不在svn中的目录(因为未指定递归),所以在脚本中使用它没有好处。使用:powershell -Command"&{(svn status --no-ignore) -match [\?i] -replace ^.{8} | remove-item -force -recurse}"

SVN中的许多事情可以用不同的方式完成,如此处给出的各种命令行答案所证明的。随着1.7版的问世,TortoiseSVN的另一种技术实际上提供了比Stefan提供的答案更好的颗粒分辨率,使您可以从忽略的文件中分别选择非版本文件。只需选择TortoiseSvn >> Clean up...打开此对话框。

这个单行代码对我有用(基于理查德·汉森的答案,这令人惊讶地不适用于包含空格的文件):

12svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d" " -I{} rm {} 相关讨论 要也删除未版本控制的文件夹,请在rm命令中添加-fr:svn status --no-ignore | grep ^ [I?] |切-c 9- | xargs -d" n" -I {} rm -fr {}

使用TortoiseSVN:

右键单击工作副本的根目录,然后选择TortoiseSVN->"检查修改" 选择"显示忽略的文件" 按"文本状态"列排序 滚动到"非版本化"文件,现在全部分组在一起;全部选中它们,然后右键单击->删除 滚动到"忽略的"文件,现在所有文件分组在一起;全部选中它们,然后右键单击->删除

这并不是一个很好的解决方案,而是我所知道的最快方法(在Windows上)。

感谢pkh提供有关忽略文件的提示。

相关讨论 我相信这只会删除非版本文件。被忽略的物品不会受到影响。 您不需要使用提交对话框,就可以忽略文件: TortoiseSVN |检查修改。然后,您可以单击"显示忽略的文件"并适当地排序/删除。

有人说您不能从Windows命令行执行此操作。

公牛。

1for /f"tokens=2 delims=" %I IN ('svn st --no-ignore ^| findstr /R"^[I?]"') DO (DEL /S /F /Q /A:H"%I" & rmdir /S /Q"%I")

只需一行即可完成,不需要单个GNU工具。 :)

相关讨论 for f"tokens=2 delims=" %%I IN (svn st --no-ignore ^| findstr R"^[I?]") DO (DEL S F Q A:H"%%I" & rmdir S Q"%%I") @DarienPardinas,如果插入Jenkins"执行Windows批处理命令",则您的版本特别有用,我刚刚学到的不是命令提示符,而是更像批处理脚本,因此需要%%而不是%

这类似于其他答案,但实际上得到了忽略的文件(请注意RE中的" I"):

1 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'` 相关讨论 如果文件名包含空格,则会中断

如果您使用的是Linux系统,则不能仅使用SVN命令行(尽管不确定GUI工具)删除它们,这可能会有所帮助:

Delete Unversioned Files Under SVN

另一种(残酷的)方法是提交更改,从文件夹中删除所有内容,然后再次签出。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3